//package com.example.demo.word;
//
//import com.alibaba.excel.EasyExcel;
//import com.alibaba.excel.ExcelWriter;
//import com.alibaba.excel.write.builder.ExcelWriterBuilder;
//import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
//import com.alibaba.excel.write.metadata.WriteSheet;
//import com.alibaba.excel.write.metadata.fill.FillConfig;
//import com.deepoove.poi.XWPFTemplate;
//import com.deepoove.poi.data.PictureRenderData;
//import com.deepoove.poi.data.Pictures;
//import com.deepoove.poi.xwpf.NiceXWPFDocument;
//import com.example.demo.word.excetption.IllegalParamsException;
//import com.example.demo.word.functions.SerializeConsumer;
//import com.example.demo.word.model.RenderRowParam;
//import com.example.demo.word.model.WordGenerateConfig;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.time.DateFormatUtils;
//import org.apache.poi.xwpf.usermodel.XWPFTable;
//import org.apache.poi.xwpf.usermodel.XWPFTableCell;
//import org.apache.poi.xwpf.usermodel.XWPFTableRow;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.math.BigDecimal;
//import java.math.RoundingMode;
//import java.nio.file.Files;
//import java.util.*;
//
//@Component
//public class GenerateUtil {
//
//
//    /**
//     * 生成word文件
//     * @param config 配置项
//     * @return 生成后的word文件,如果转换PDF,文件为PDF文件
//     */
//    /**
//     * 根据配置生成Word文档
//     *
//     * @param config Word生成配置，包含输出路径、模板路径、文件名等信息
//     * @return 生成的Word文档文件，如果配置了转换为PDF，则返回PDF文件
//     * @throws Exception 如果文件操作或模板处理过程中发生错误，则抛出异常
//     */
//    public File generateWord(WordGenerateConfig config) throws Exception {
//        // 创建输出目录的File对象
//        final File outputDir = new File(config.outputPath);
//        // 创建模板文件的File对象
//        final File templateFile = new File(config.templatePath);
//        // 在输出目录下创建输出文件的File对象，文件名根据配置而来
//        File outputFile = new File(outputDir, config.fileName + ".docx");
//        // 检查输出文件和目录，确保合法性
//        checkFIle(outputFile, outputDir);
//
//        // 使用try-with-resources确保资源正确关闭
//        try (FileInputStream fileInputStream = new FileInputStream(templateFile);
//             FileOutputStream fos = new FileOutputStream(outputFile);
//             XWPFTemplate template = GenerateTemplateUtils.compileTableTemplate(fileInputStream, config.tagNames)) {
//
//            // 创建一个弱引用的HashMap，用于存储表格索引和标签的映射关系
//            Map<Integer,String> tableMap = new WeakHashMap<>();
//
//            // 获取模板文档对象
//            NiceXWPFDocument xwpfDocument = template.getXWPFDocument();
//            // 获取文档中的所有表格
//            List<XWPFTable> allTables = xwpfDocument.getAllTables();
//            // 遍历所有表格，寻找包含特定标签的表格，并记录其索引和标签
//            for (int i = 0; i < allTables.size(); i++) {
//                XWPFTable table = allTables.get(i);
//                String text = table.getText();
//                // 检查表格文本中是否包含特定格式的标签
//                if (text.contains("{{") && text.contains("[") && text.contains("]")){
//                    // 获取表格第一行第一列的单元格
//                    XWPFTableCell firstCell = table.getRow(0).getCell(0);
//                    String firstCellText = firstCell.getText();
//                    // 提取单元格中的标签
//                    String tag = getCellTag(firstCellText);
//                    // 将表格索引和标签存入映射
//                    tableMap.put(i,tag);
//                }
//            }
//
//            // 渲染模板，将数据填充到模板中
//            template.render(config.data, fos);
//
//            // 遍历所有标记的表格，根据标签从配置中获取回调函数，对表格进行进一步处理
//            tableMap.forEach((index, tag) -> {
//                XWPFTable table = allTables.get(index);
//                // 获取回调函数，根据标签从配置中获取
//                SerializeConsumer<RenderRowParam> callback = config.rowCallback.get(tag);
//                if (callback != null){
//                    // 获取当前标签对应的数据列表
//                    List<Map<String,Object>> list = (List<Map<String,Object>>)config.data.get(tag);
//                    // 获取表格的所有行
//                    List<XWPFTableRow> rows = table.getRows();
//                    // 遍历除标题行之外的所有行，使用回调函数处理每一行
//                    for (int i = 1; i < rows.size(); i++) {
//                        RenderRowParam param = new RenderRowParam();
//                        param.setIndex(i);
//                        param.setRow(rows.get(i));
//                        param.setTagName(tag);
//                        param.setRowData(list.get(i-1));
//                        callback.accept(param);
//                    }
//                }
//            });
//
//            // 将模板内容写入并关闭输出流
//            template.writeAndClose(Files.newOutputStream(outputFile.toPath()));
//
//        }
//
//        // 如果配置中要求将Word转换为PDF
//        if (config.isTransformPdf) {
//            // 使用Aspose库将Word转换为PDF
//            File pdf = AsposeUtils.wordToPdf(outputFile, new File(outputDir, config.fileName + ".pdf"));
//            // 如果配置中要求删除源文件，则删除生成的Word文档
//            if (config.isDeleteSource){
//                outputFile.delete();
//            }
//            // 返回PDF文件
//            return pdf;
//        }
//        // 如果不需要转换为PDF，直接返回生成的Word文档
//        return outputFile;
//    }
//
//    private String getCellTag(String cellText){
//        int prefix = cellText.indexOf("{{");
//        int suffix = cellText.indexOf("}}");
//        return cellText.substring(prefix + 2,suffix);
//    }
//
//    public File generateExcelFile(String templatePath, String excelFilePath, String fileName,String sheetName,Object... excelData) throws IOException {
//        File template = new File(templatePath);
//        File output = new File(excelFilePath);
//        File excel = new File(output, fileName);
//        checkFIle(excel, output);
//        ExcelWriter writer = null;
//        try {
//            ExcelWriterBuilder builder = EasyExcel.write(excel).withTemplate(template);
//            ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcel.writerSheet();
//            WriteSheet sheet = excelWriterSheetBuilder.build();
//            sheet.setCustomWriteHandlerList(Collections.singletonList(new CustomSheetWriterHandler(sheetName)));
//            writer = builder.build();
//            FillConfig config = FillConfig.builder().forceNewRow(true).build();
//            for (Object data : excelData) {
//                if (data instanceof Collection){
//                    writer.fill(data,config, sheet);
//                    continue;
//                }
//                writer.fill(data, sheet);
//            }
//        } finally {
//            if (writer != null) {
//                writer.finish();
//            }
//        }
//        return excel;
//    }
//
//    /**
//     * 检查文件或文件夹是否存在，不存在就新建
//     * @param outputFile 输出文件
//     * @param outputDir 输出文件夹
//     * @throws IOException 过程中的异常
//     */
//    private void checkFIle(File outputFile, File outputDir) throws IOException {
//        if (!outputDir.exists()) {
//            outputDir.mkdirs();
//        }
//        if (!outputFile.exists()) {
//            outputFile.createNewFile();
//        }
//    }
//
//    private void assertParams(String[] params,Map<String,Object> values,String template){
//        List<String> descriptions = new ArrayList<>();
//        for (String param : params) {
//            String[] split = param.split(",");
//            String name = split[0];
//            String description = split[1];
//            Object value = values.get(name);
//            if (value == null || StringUtils.isBlank(String.valueOf(value))){
//                descriptions.add(description);
//            }
//        }
//        if (!descriptions.isEmpty()){
//            throw new IllegalParamsException(String.format(template,StringUtils.join(descriptions,",")));
//        }
//    }
//
//}
